package com.malou.client.ventas.direccioncliente;

import java.util.ArrayList;
import java.util.List;

import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.CheckBoxSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.malou.client.MalouConstants;
import com.malou.client.MalouMessages;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.cliente.ClientePanel;
import com.malou.client.ventas.ubigeo.Pais;
import com.malou.client.ventas.ubigeo.Ubigeo;


public class DireccionClientePanel extends ContentPanel {

	private DireccionClienteDialog dialog;
	private BeanModel selectedModel;
	private Button editCliente;
	private Button deleteCliente;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private MalouMessages messages = GWT.create(MalouMessages.class);
	private List<BeanModel> selectedModels;
	private Integer selectedSize;
	private ToolBar toolBar;
	public Button addCliente;
	private SeparatorToolItem separatorAdd;
	private SeparatorToolItem separatorEdit;

	public DireccionClientePanel() {
		super();
		setFrame(true);
		setCollapsible(true);
		setAnimCollapse(false);

		setIcon(IconHelper.createPath("images/icons/table.png"));
		setHeading(constants.direccionLista());
		setLayout(new FitLayout());
		
		DireccionClientes.getDireccionCliente();
		ClientePanel.dcpanel=this; 
		List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
		
		toolBar = new ToolBar(); 

		final CheckBoxSelectionModel<BeanModel> sm = new CheckBoxSelectionModel<BeanModel>();

		columns.add(sm.getColumn());
		columns.add(new ColumnConfig("pais", constants.direccionPais(),80));
		columns.add(new ColumnConfig("departamento", constants.direccionDepartamento(),80));
		columns.add(new ColumnConfig("provincia", constants.direccionProvincia(),80));
		columns.add(new ColumnConfig("distrito", constants.direccionDistrito(),100));
		columns.add(new ColumnConfig("ciudad", constants.direccionCiudad(),100));
		columns.add(new ColumnConfig("direccion", constants.clienteDireccion(),250));
		columns.add(new ColumnConfig("referencias", constants.referencia(),250));
	

		ColumnModel cm = new ColumnModel(columns);

		Grid<BeanModel> grid = new Grid<BeanModel>(DireccionClientes.store, cm);
		grid.setAutoExpandColumn("referencias");

		grid.setLoadMask(true);
		grid.setBorders(true);


		
		addCliente = new Button(constants.agregar(),IconHelper.createPath("images/icons/new.gif"));
		addCliente.setEnabled(false);
		addCliente.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				dialog.unbind();
				dialog.reset();				
				dialog.show();
			}
		});
		
		dialog = new DireccionClienteDialog();
		dialog.setStore(DireccionClientes.store);

		
		toolBar.add(addCliente);
		separatorAdd = new SeparatorToolItem();
		toolBar.add(separatorAdd);
		deleteCliente = new Button(constants.eliminar(),IconHelper.createPath("images/icons/delete.gif"));
		deleteCliente.setEnabled(false);
		
		
		
		final Listener<MessageBoxEvent> l = new Listener<MessageBoxEvent>() {
			public void handleEvent(MessageBoxEvent ce) {
				String button_id = ce.getButtonClicked().getItemId();
				if (Dialog.YES == button_id) {
					DireccionClientes.direccionclienteDialog = dialog;

					if (selectedSize == 1) {
						Integer id = selectedModel.get("id");
						DireccionClientes.delete(id);
					} else if (selectedSize > 1) {
						String ids = Utilities.toIds(selectedModels);
						DireccionClientes.deleteAll(ids);
					}
				}
			}
		};

		SelectionListener<ButtonEvent> sl_delete;
		sl_delete = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				String mensaje = "";
				if (selectedSize == 1) {
					String dir = selectedModel.get("direccion");
					
					mensaje = messages.direccionEstaSeguro(dir);
				} else if (selectedSize > 1) {
					mensaje = constants.eliminarAll();
				}
				MessageBox.confirm(constants.confirmacion(), mensaje, l)
						.getDialog().getButtonById(Dialog.YES)
						.setText(constants.si());

			}

		};

		deleteCliente.addSelectionListener(sl_delete);
		toolBar.add(deleteCliente);
		separatorEdit = new SeparatorToolItem();
		toolBar.add(separatorEdit);

		editCliente = new Button(constants.editar(),IconHelper.createPath("images/icons/update.png"));
		editCliente.setEnabled(false);
		editCliente.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				dialog.bind(selectedModel);
				dialog.beforeEdit();
				dialog.show();
				
			}
		});
		
		toolBar.add(editCliente);
		setTopComponent(toolBar);

		grid.setSelectionModel(sm);
		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						selectedSize = be.getSelection().size();
						if (selectedSize == 0) {
							editCliente.setEnabled(false);
							dialog.unbind();
							deleteCliente.setEnabled(false);							
						} else if (selectedSize == 1) {
							selectedModel = be.getSelectedItem();
							
							
							String pais=be.getSelectedItem().get("pais");
							String codigo=be.getSelectedItem().get("codigo");
							Integer pais_id=be.getSelectedItem().get("pais_id");
							
							Pais p=new Pais();
							p.setPais(pais);
							p.setCodigo(codigo);
							p.setId(pais_id);
							
							String dep=be.getSelectedItem().get("departamento");
							String prov=be.getSelectedItem().get("provincia");
							String dist=be.getSelectedItem().get("distrito");
							Integer ubigeo_id=be.getSelectedItem().get("ubigeo_id");
							
							Ubigeo ub = new Ubigeo();							
							ub.setDepartamento(dep);
							ub.setProvincia(prov);
							ub.setDistrito(dist);
							ub.setId(ubigeo_id);
							
							BeanModelFactory beanModelFactory = BeanModelLookup.get().getFactory(ub.getClass());
							BeanModel bm = beanModelFactory.createModel(ub);
						
							dialog.paises.setValue(p);
							dialog.departamento.setValue(bm);
							dialog.provincia.setValue(bm);
							dialog.distrito.setValue(bm);
							if(!codigo.trim().equals("PE")){
								dialog.departamento.setEnabled(false);
								dialog.provincia.setEnabled(false);
								dialog.distrito.setEnabled(false);
							}
						
							editCliente.setEnabled(true);
							deleteCliente.setEnabled(true);							
							
						} else if (selectedSize > 1) {
							selectedModels = be.getSelection();
							editCliente.setEnabled(false);
							dialog.unbind();
							deleteCliente.setEnabled(true);							
						}
					}

				});

		grid.addPlugin(sm);
		

		add(grid);
		setHeaderVisible(false);
	}

	public void setPermisos(List<String> permisos) {

		boolean add = permisos.contains("add");
		boolean edit = permisos.contains("edit");
		boolean delete = permisos.contains("delete");

		if (!add && !edit && !delete) {
			toolBar.setVisible(false);
		} else {
			if (!add) {
				addCliente.setVisible(false);
				separatorAdd.setVisible(false);
			}
			if (!edit) {
				editCliente.setVisible(false);
				separatorEdit.setVisible(false);
			}
			if (!delete)
				deleteCliente.setVisible(false);
		}
	}
}